iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0

標準串流

在Unix和類Unix系統中,如同某些程式語言介面一樣,標準串流是當一個電腦程式執行時,在它和它的環境間(典型為終端),事先連接的輸入和輸出頻道。這三個I/O連結稱作「標準輸入」、「標準輸出」和「標準錯誤輸出」。

檔案描述子

在講解標準輸入輸出與重導向前,先來簡單了解檔案描述子(File descriptor, FD)
檔案描述子是一個非負整數的索引,指向核心為每一個行程所維護的該行程打開檔案的記錄表。當程式打開一個現有檔案或者建立一個新檔案時,核心向行程傳回一個檔案描述子。

檔案描述子這一概念只適用於(類)UNIX作業系統。

標準輸入(stdin)

  • 指輸入至程式的資料(通常是檔案)
  • 預設由鍵盤取得,除非有資料從重導向進入
  • 檔案描述子為0

標準輸出(stdout)

  • 程式寫輸出資料的串流
  • 預設輸出到terminal,除非指定資料重導向
  • 檔案描述子為1

標準錯誤輸出(stderr)

  • 輸出錯誤訊息
  • 獨立於標準輸出,且可以分別被重導
  • 把標準輸出和標準錯誤輸出導到相同的目的地,如文字終端,是可行且正常運作的
  • 檔案描述子為2

重新導向

執行命令前可使用shell的特殊符號對輸入/輸出進行重新導向,假如我想將目前資料夾中所有檔案的名稱(不含子資料夾)都存在一個檔案中我就可以用$ ls > file來達成

其他重新導向的語法如下

$ command > file # 將檔案內容覆蓋為命令的標準輸出

$ command >> file # 將命令的標準輸出附加至檔案結尾

$ command < file # 以file的內容做為命令輸入

$ command 2>&1 # 將錯誤訊息導向到標準輸出(&n指檔案描述子n)
$ command &> file # 等價於上一個命令

$ command <<< "stdtxt" # 將字串作為標準輸入(bash 2.05b新增)

順便一提,如果看到在>跟<的中旁邊有不帶空格的|時,代表不管檔案是否已經存在都強制覆蓋檔案

$ command >| force-write-file

管線指令

在類Unix作業系統中,管線指令(Pipe command)是一系列將標準輸入輸出連結起來的行程,其中每一個行程的輸出被直接作為下一個行程的輸入,常用於過濾輸出。而Windows在powershell也引用了類似的設計

管線指令使用 | (pipe) 使得多個程式可以一起執行,一個程式可以直接將另外一個程式的輸出作為其輸入,並且不需要藉助中間檔案。
一個很好的例子是在非互動的shell中可以使用echo與管線指令以達到一定的互動效果

$ echo "print('amogus')" | python3
amogus

REF

管道(wiki)
檔案描述子(wiki)
標準串流
Bash Reference Manual


上一篇
Day6: Linux的各個基本指令
下一篇
Day8: 套件管理
系列文
I Use Linux BTW: 談Linux與其指令30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言